// 正则表达式维护

// 社会统一信用代码
export const isSocialcredit = /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/

// 手机号
export const isPhone = /^[1](([3][0-9])|([4][0,1,4-9])|([5][0-3,5-9])|([6][2,5,6,7])|([7][0-8])|([8][0-9])|([9][0-3,5-9]))[0-9]{8}$/

// 邮箱
export const isEmail = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/

// 传真
export const isFax = /^(?:\d{3,4})?[- ]?\d{7,8}[- ]?[* ]?[, ]{0,8}?(?:\d{1,6})?$/

// 座机
export const isTelephone = /^([0-9]{3,4}-)?[0-9]{7,8}$/

// 邮政编码
export const isPostCode = /^([0-9]{6})$/

// 身份证
export const idCard = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i

// 姓名
export const isName = /^([\u4e00-\u9fa5]{2,20}|[a-zA-Z.\s]{2,20})$/

// 纯整数
export const isIntNumber = /^[0-9]*$/

//两位小数的数字,可以为负数
export const positiveNumberReg = /^\-?((\d+(\.\d{0,2})?)|(\d*\.\d{1,2}))$/;

//校验是否含有中文
export const isChinese = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi;

// 是否含有字母
export const hasLetter = /[A-Za-z]/;
/**
 * 生成表单的自定义校验函数
 * @param {RegExp} reg 
 * @param {String} errMsg
 * @param {Boolean} needEmpty 是否需要对空值执行验证(默认不执行)
 * @param {Function} doneCallback 验证后的回调函数，该函数接收一个对象参数：{valid: true, message: '' }，分别表示验证是否通过，以及未通过时的错误提示信息
 */
export function createValidator(reg, errMsg, needEmpty = false, doneCallback) {
    return function (rule, value, callback) {
        if (!needEmpty) {
            if (value !== 0 && !value) {
                callback()
                doneCallback && doneCallback({
                    rule,
                    valid: true,
                    message: ''
                })
                return
            }
        }
        const regInstance = reg
        const msgInstance = errMsg
        if (!regInstance.test(value)) {
            callback(new Error(msgInstance))
            doneCallback && doneCallback({
                rule,
                valid: false,
                message: msgInstance
            })
        } else {
            callback()
            doneCallback && doneCallback({
                rule,
                valid: true,
                message: ''
            })
        }
    }
}

/**
 * 生成一个验证工具对象
 */
export function createValidTool() {
    const toolObj = {
        validatorList: [],
        /**
         * 用于更新当前验证的所有对象
         * @param {Object} data 格式是createValidator完成回调的参数
         */
        update(data) {
            const { rule } = data
            if (!rule) {
                console.error('data.rule must be object')
                return
            }
            const index = this.validatorList.findIndex(item => item.rule.field === rule.field)
            if (index > -1) {
                this.validatorList.splice(index, 1, data)
            } else {
                this.validatorList.push(data)
            }
        },
        /**
         * 用于验证当前所有收集的验证对象是否全都验证通过
         * @return {Object} validInfo  validInfo.valid为验证结果
         */
        validate() {
            const validInfo = this.validatorList.find(item => {
                return !item.valid
            })
            return validInfo || { valid: true }
        }
    }
    return toolObj
}